package com.cw.DesignModel23.Structural.FlyweightPattern.Flyweight1;

/**
 * 1 . 定义 抽象享元类 AbstractFlyweight :
 *
 *
 * ① 定义内部状态 : private String intrinsicState是内部状态 , 也就是多个 细粒度对象 ( 用户持有的多个对象 ) 共享的信息 , 这部分内容我们不关心 , 为其设置 Getter 和 Setter 方法即可 ;
 *
 * ② 定义外部状态 : protected final String externalState , 外部状态推荐使用 final 修饰 , 这是为了避免其在构造函数外的地方修改该值 , 外部状态值只能在对象创建的时候赋值一次 , 其它任何时候都不允许修改该值 ;
 *
 * ③ 定义抽象行为 : abstract void action() , 这是享元类的具体逻辑 , 在具体享元角色中实现该类 ;
 * ————————————————
 * 版权声明：本文为CSDN博主「韩曙亮」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/shulianghan/article/details/105452239
 *
 * 抽象的享元角色
 */
public abstract class AbstractFlyweight {
    /**
     * 内部状态
     */
    private String intrinsicState;

    /**
     * 外部状态
     * 注意使用 final 修饰只能 ① 马上初始化 ② 在构造函数中初始化
     * 没有其它的初始化途径
     */
    protected final String externalState;

    public AbstractFlyweight(String externalState) {
        this.externalState = externalState;
    }

    /**
     * 抽象的行为
     */
    abstract void action();

    /*
        下面是访问内部状态的 Getter 和 Setter 方法
     */
    public String getIntrinsicState() {
        return intrinsicState;
    }
    public void setIntrinsicState(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    /**
     * 获取外部状态的数据
     * 该数据用于 作为 对比两个对象是否一致 的依据
     * @return
     */
    public String getExternalState() {
        return externalState;
    }
}

